﻿using System;
using System.Collections.Generic;
using Microsoft.Win32;

namespace DevelopTool.Common
{
    /// <summary>
    /// 系统右键菜单帮助类
    /// </summary>
    public class SystemContextMenuHelper
    {
        /// <summary>
        /// 需要尝试两个注册表位置，因为有些系统用户可能权限不够
        /// </summary>
        private static readonly List<RegistryKey> baseRegistryKeys = new List<RegistryKey> { Registry.LocalMachine,Registry.CurrentUser };

        #region 文件

        /// <summary>
        /// 添加文件类型关联的右键菜单项和命令，支持自定义参数。
        /// </summary>
        /// <param name="extension">文件扩展名（包含点号，例如 .txt）。如果需要全部文件那么就是*</param>
        /// <param name="menuName">右键菜单项显示的名称。</param>
        /// <param name="actionName">在注册表中标识该操作的名称。</param>
        /// <param name="customArguments">自定义参数字符串，例如 "FileType=%2 Action=%3"。</param>
        public static bool AddFileTypeAssociation(string extension,string menuName,string actionName,string customArguments = null)
        {
            bool isSetOk = false;

            // 注册表路径
            string keyPath = $@"Software\Classes\{extension}\shell\{actionName}";

            foreach(RegistryKey baseRegistryKey in baseRegistryKeys)
            {
                try
                {
                    // 创建或打开注册表项
                    using(RegistryKey key = baseRegistryKey.CreateSubKey(keyPath))
                    {
                        // 设置右键菜单项名称
                        key.SetValue("",menuName);

                        // 设置菜单项图标（可选，如果需要）
                        key.SetValue("Icon",GlobalData.AppPath);
                    }

                    // 创建命令项
                    using(RegistryKey key = baseRegistryKey.CreateSubKey(keyPath + @"\command"))
                    {
                        // 设置命令行参数，%1 表示文件路径参数，如果 customArguments 不为空则使用，否则只传 %1
                        if(!string.IsNullOrEmpty(customArguments))
                        {
                            key.SetValue("",$"\"{GlobalData.AppPath}\" \"%1\" {customArguments}");
                        }
                        else
                        {
                            key.SetValue("",$"\"{GlobalData.AppPath}\" \"%1\"");
                        }
                    }

                    isSetOk = true;
                    break;
                }
                catch(Exception)
                {
                    continue;
                }
            }
            return isSetOk;

        }


        /// <summary>
        /// 查询指定文件类型的右键菜单项和命令是否存在。
        /// </summary>
        /// <param name="extension">文件扩展名（包含点号，例如 .txt）。</param>
        /// <param name="actionName">要查询的操作标识。</param>
        /// <returns>如果右键菜单项和命令存在，则返回 true；否则返回 false。</returns>
        public static bool IsFileTypeAssociationExists(string extension,string actionName)
        {
            // 注册表路径
            string keyPath = $@"Software\Classes\{extension}\shell\{actionName}";

            foreach(RegistryKey baseRegistryKey in baseRegistryKeys)
            {
                // 检查注册表项是否存在
                using(RegistryKey key = baseRegistryKey.OpenSubKey(keyPath))
                {
                    if(key != null) return true;
                }
            }

            return false;
        }



        /// <summary>
        /// 删除文件类型关联的右键菜单项和命令。
        /// </summary>
        /// <param name="extension">文件扩展名（包含点号，例如 .txt）。</param>
        /// <param name="actionName">在注册表中标识要删除的操作的名称。</param>
        public static void RemoveFileTypeAssociation(string extension,string actionName)
        {
            // 注册表路径
            string keyPath = $@"Software\Classes\{extension}\shell\{actionName}";

            foreach(RegistryKey baseRegistryKey in baseRegistryKeys)
            {
                try
                {
                    // 删除注册表项
                    baseRegistryKey.DeleteSubKeyTree(keyPath,false);
                }
                catch(Exception)
                {
                    continue;
                }
            }

            WindowsHelper.RefreshExplorer();
        }

        #endregion 文件

        #region 目录

        /// <summary>
        /// 删除目录类型关联的右键菜单项和命令。
        /// </summary>
        /// <param name="actionName">在注册表中标识要删除的操作的名称。</param>
        public static void RemoveFolderTypeAssociation(string actionName)
        {
            // 注册表路径
            string keyPath = $@"Software\Classes\Directory\shell\{actionName}";

            foreach(RegistryKey baseRegistryKey in baseRegistryKeys)
            {
                try
                {
                    // 删除注册表项
                    baseRegistryKey.DeleteSubKeyTree(keyPath,false);
                }
                catch(Exception)
                {
                    continue;
                }
            }
            WindowsHelper.RefreshExplorer();
        }

        /// <summary>
        /// 添加目录类型关联的右键菜单项和命令，支持自定义参数。
        /// </summary>
        /// <param name="menuName">右键菜单项显示的名称。</param>
        /// <param name="actionName">在注册表中标识该操作的名称。</param>
        /// <param name="customArguments">自定义参数字符串，例如 "FolderType=%2 Action=%3"。</param>
        public static bool AddFolderTypeAssociation(string menuName,string actionName,string customArguments = null)
        {
            bool isSetOk = false;

            // 注册表路径
            string keyPath = $@"Software\Classes\Directory\shell\{actionName}";

            foreach(RegistryKey baseRegistryKey in baseRegistryKeys)
            {
                try
                {
                    // 创建或打开注册表项
                    using(RegistryKey key = baseRegistryKey.CreateSubKey(keyPath))
                    {
                        // 设置右键菜单项名称
                        key.SetValue("",menuName);

                        // 设置菜单项图标（可选，如果需要）
                        key.SetValue("Icon",GlobalData.AppPath);
                    }

                    // 创建命令项
                    using(RegistryKey key = baseRegistryKey.CreateSubKey(keyPath + @"\command"))
                    {
                        // 设置命令行参数，%1 表示目录路径参数，如果 customArguments 不为空则使用，否则只传 %1
                        if(!string.IsNullOrEmpty(customArguments))
                        {
                            key.SetValue("",$"\"{GlobalData.AppPath}\" \"%1\" {customArguments}");
                        }
                        else
                        {
                            key.SetValue("",$"\"{GlobalData.AppPath}\" \"%1\"");
                        }
                    }
                    isSetOk = true;

                    break;
                }
                catch(Exception)//权限不足
                {
                    continue;
                }
            }
            return isSetOk;

        }



        /// <summary>
        /// 查询指定目录类型的右键菜单项和命令是否存在。
        /// </summary>
        /// <param name="actionName">要查询的操作标识。</param>
        /// <returns>如果右键菜单项和命令存在，则返回 true；否则返回 false。</returns>
        public static bool IsFolderTypeAssociationExists(string actionName)
        {
            // 注册表路径
            string keyPath = $@"Software\Classes\Directory\shell\{actionName}";

            foreach(RegistryKey baseRegistryKey in baseRegistryKeys)
            {
                // 检查注册表项是否存在
                using(RegistryKey key = baseRegistryKey.OpenSubKey(keyPath))
                {
                    if(key != null) return true;
                }
            }
            return false;
        }

        #endregion 目录
    }
}
